package com.zmn.oms.zmn.business.interfaces.chan;

import com.zmn.oms.common.exception.chan.ChannelFacadeException;
import com.zmn.oms.common.exception.chan.DuplicateOrderClueException;
import com.zmn.oms.model.entity.chan.FacadeMessage;
import com.zmn.oms.model.entity.chan.FacadeMessageEvent;
import com.zmn.oms.model.entity.chan.OrderClue;

/**
 * 类描述：渠道订单线索业务接口
 *
 * @author lhl
 * @date 2020/12/29 15:52
 */
public interface FacadeOrderClueBService {

    /**
     *  保存渠道订单线索索引
     * @param orderClue 渠道订单线索索引对象，该对象的 facadeId 和 outerId 字段不能为null
     * @param facadeMessage 渠道消息元数据，该对象的 facadeId、eventTag、content 字段不能为null
     * @param generateFacadeOrderId 是否生成需要返回给渠道方的啄木鸟订单ID，如果为 true，生成的ID将
     *                              在方法调用结束后保存在 orderClue 参数对象的 facadeOrderId 字段中
     * @throws DuplicateOrderClueException 当判定该线索为重复收到时被抛出，
     *                              判定条件为：orderClue.facadeId 和 orderClue.outerId 组合值是否唯一
     * @throws ChannelFacadeException 当参数不全或保存失败时被抛出
     */
    void saveOrderClue(OrderClue orderClue, FacadeMessage facadeMessage, boolean generateFacadeOrderId)
            throws DuplicateOrderClueException, ChannelFacadeException;

    /**
     * 保存订单的业务消息，并返回对应的订单线索；当未找到对应的订单线索时，返回null，并且消息不会被保存
     * @param facadeMessage 渠道消息元数据，该对象的 facadeId、eventTag、content 字段不能为null
     * @param outerId 渠道订单号
     * @param channelId 渠道ID
     * @return 对应的订单线索，当订单线索不存在时，返回null
     * @throws ChannelFacadeException 当参数不全或保存消息失败时被抛出
     */
    OrderClue saveOrderBizMessage(FacadeMessage facadeMessage, String outerId, Integer channelId)
            throws ChannelFacadeException;

    /**
     * 收到订单的业务消息，保存消息并获取对应的订单线索
     * @param event
     * @param outerId 渠道订单号
     * @return 对应的订单线索
     * @throws ChannelFacadeException 当未找到对应的订单线索或保存消息失败时被抛出
     */
    OrderClue receiveOrderBizMessage(FacadeMessageEvent event,
                                    String outerId) throws ChannelFacadeException;

    /**
     * 使用主键查询订单线索索引
     * @param key
     * @return
     */
    OrderClue findOrderClueByKey(Long key);

    /**
     * 保存啄木鸟系统单号
     * @param key
     * @param zmnOrderId
     * @param state
     * @return
     */
    int saveZmnOrderIdByKey(Long key, Long zmnOrderId, Integer state);

    /**
     * 通过主键修改状态
     * @param key
     * @param state
     * @return
     */
    int updateStateByKey(Long key, Integer state);

    /**
     * 使用对接接口ID和渠道订单ID查询订单线索索引
     * @param facadeId
     * @param outerId
     * @param channelId 可以为null
     * @return
     */
    OrderClue findOrderClueByFacadeIdAndOuterId(Integer facadeId, String outerId, Integer channelId);

    /**
     * 使用返回给渠道方的啄木鸟订单ID查询订单线索索引
     * @param facadeOrderId
     * @return
     */
    OrderClue findByFacadeOrderId(Long facadeOrderId);

    /**
     * 使用系统中对应的的订单ID查询订单线索索引
     * @param zmnOrderId
     * @return
     */
    OrderClue findByZmnOrderId(Long zmnOrderId);
}
